﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IGraphicsNode.h"

namespace gcmp
{
    class IPolyCurve3d;
    class ICurve3d;
    class IGraphicsCurve3d;

    /// \brief 三维多段线图形节点
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsPolyCurve3d : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(gcmp::IGraphicsPolyCurve3d, gcmp::IGraphicsNode)

    public:
        /// \brief 析构器
        virtual ~IGraphicsPolyCurve3d() {};

        /// \brief 获取三维多段线
        /// 
        /// \return 三维多段线几何数据
        virtual const IPolyCurve3d* GetGeometry()const = 0;

        /// \brief 设置三维多段线
        /// 
        /// \param pValue 三维多段线几何数据
        /// \return true-设置成功；false-设置失败
        virtual bool SetGeometry(const IPolyCurve3d* pValue) = 0;

        /// \brief  获取多段线中曲线的数量
        /// 
        /// \brief  曲线的数量
        virtual int GetCurveCount()const = 0;

        /// \brief   按顺序获取多段线中所有的曲线（拷贝实现）
        /// 
        /// \param  opCurve3dlist 多段线中所有的曲线数组
        /// \return  成功返回true,否则返回false(默认返回True)
        virtual bool GetAllCurves(std::vector<OwnerPtr<ICurve3d>>& opCurve3dlist) const = 0;

        /// \brief  获取多段线整体线宽值
        /// 
        /// 获取的线宽值是多段线线宽属性值，并非多段线的样式线宽，其显示效果不受线宽显示开关的影响
        /// \return 多段线整体的线宽值
        virtual double GetLineWidth() const = 0;

        /// \brief  设置多段线整体线宽值
        /// 
        /// 设置的线宽值作为多段线的一个属性，并非多段线的样式线宽值，其显示效果不受线宽显示开关的影响
        /// 若设置的线宽值为0或者处于定像素模式下，那么多段线显示的线宽与样式线宽值保持一致,显示效果会受线宽显示开关影响
        /// \param  lineWidth      线宽值
        /// \return 设置成功返回true,否则返回false
        virtual bool SetLineWidth(double lineWidth) = 0;

        /// \brief 获取调试信息
        ///
        /// \return 调试信息
        virtual std::wstring GetStringForDebug() const = 0;

        /// \brief 对多段线进行平移
        /// 
        /// \param offset 平移向量
        /// \return 返回true表示平移成功，返回false表示平移失败
        virtual bool Translate(const Vector3d& offset) = 0;

        /// \brief 获取或生成三维多段线内部图形节点
        ///
        /// \return 返回三维多段线内部图形节点
        virtual std::vector<IGraphicsCurve3d*> GetAllGCurvesFW() = 0;

        /// \brief 获取或生成三维多段线内部图形节点
        ///
        /// \return 返回三维多段线内部图形节点
        virtual const std::vector<const IGraphicsCurve3d*> GetAllGCurves() const = 0;

    public:
        /// \brief 通过一个三维多段线几何，来创建一个多段线图形节点
        /// 
        /// \param pPolyCurve3d 三维几何多段线
        /// \return 三维多段线图形节点
        static OwnerPtr<IGraphicsPolyCurve3d> Create(const IPolyCurve3d* pPolyCurve3d);
    };
}
